# coding:utf-8
# 王一舟
# P01_test_flask.py

#1导包
from flask import Flask,request #这里的request不是发送请求的request库,而是flask自带的类
from msg_data import * #导入该文件下的所有内容,比那辆直接使用
#2给当前的应用取一个对象名
app = Flask(__name__) # 魔术方法 __name__ , 代表:将当前的这个文件,作为一个应用,作为一个服务去启动


#主页接口
#3这个应用要有哪些接口? -- 接口 = 方法 ; 接口的请求路径, 请求方式 , 请求参数, 响应数据
@app.route("/") # 装饰器 定义url路径
@app.route("/index") # 装饰器 定义url路径
#路径装饰器可以有多个,代表多个路径都能访问本接口
def index():
    #不定义,默认就是get请求
    return "明天开始奋战!1111222" # return 代表这个接口的响应数据
#启动后输出栏会提示 * Running on http://127.0.0.1:5000 代表地址 , 根据装饰器 @app.route("/index") 中定义的路径,
#根据装饰器 @app.route("/index") 中定义的路径组成接口地址,http://127.0.0.1:5000/index
#因为是get请求,通过浏览器访问即可



#登录接口
@app.route("/login",methods=["POST"]) # 装饰器 定义url路径 / methods=["post"] : 定义这个接口为post请求
def login():
    #POST请求如果通过浏览器访问会提示 405 Method Not Allowed,代表请求方式不对
    #只能通过requests等工具访问

    #todo 当有请求访问过来,会先拿传参进行比较(数据库/模拟数据),比较完毕后返回对应的响应数据

    #1 拿请求数据 (可以尝试创建数据库表,连接,查询这个用户名和密码对不对)
    res = request.get_json() # - 获取json方式的传参
    # 注意:!这里的request不是发送请求的request库, 而是flask自带的类
    # res = request.get_data() # - 获取data方式的传参
#这里的request不是发送请求的request库, 而是flask自带的类
    print(res)

    #2 校验数据,然后返回对应的结果 - 可以使用数据库 / 模拟数据 ,这里使用模拟数据
    alluser = {"wyz":"123456","admin":"admin"} #可以正常登录的用户数据(假设模拟)
    '''
    场景设计:
      1.数据为空
      2.登录成功
      3.密码不正确
      4.用户名不正确
      5.参数填写错误
    '''

    try:
        # 获取用户名和密码
        username = res["username"]  # 传进来的用户名  wyz 注意:这里不用get()是因为如果获取不到会报错,就说明传参本身出错,被except Exception捕获
        password = res["password"]  # 传进来的密码  123456 注意:这里不用get()是因为如果获取不到会报错,就说明传参本身出错,被except Exception捕获
        all_psw = alluser.get(username,None)#通过参数如用户名,在所有用户数据中拿密码

        if all_psw != None: #如果数据库中能拿到密码,那就说明用户名是存在的

            if username == "" or password == "":
                return MSG_DATA_NULL #用户名和密码不能为空

            elif alluser[username] == password:
                #这里有点绕,对比的是2个密码,数据库中查询的结果,以传参用户名为key获取value,再对比传参的密码
                #证明:有这个用户,同时密码也一致
                return MSG_LOGIN_SUCCESS
            elif alluser[username] != password:
                #证明能拿到这个用户,但是密码不一致
                return MSG_ERROR_PASSWORD #密码错误
        else:
            return MSG_ERROR_USERNAME #用户名不存在  # 如果拿不到密码,说明用户不存在

    except Exception :
        return MSG_DATA_ERROR #传参错误


#查看登录信息
@app.route("/api/info",methods=["GET"]) # 装饰器 定义url路径 / methods=["GET"] : 定义这个接口为post请求
def info():
    #todo 1 获取用户信息,哪个用户? 要鉴权 -token
    try:
        token = request.headers.get("token") #从发来的请求头中获取token

        if token == MSG_LOGIN_SUCCESS["data"]["token"] : #这里应该是从数据库拿,暂时拿本地的应付一下
            #如果token对吧一致,认为登录成功
            return MSG_LOGIN_SUCCESS
        else:
            #否则登录失效
            return MSG_LOGIN_ERROR
    except Exception:
        return MSG_DATA_ERROR #如果没有获取到token,"登录数据有误"



#4启动接口
#执行主函数中的app.run()后,代表本py文件作为服务启动
if __name__ == '__main__':
    # app.run() #启动

    app.run(debug=True)
    # 由于每次修改代码都需要重新启动服务才能生效;
    # 可以使用调试模式启动 app.run(debug=True).只要修改代码,保存(ctrl+s),自动重新启动

'''
启动后,当有请求过来
输出栏会有对应的显示,可以理解为日志
如:
127.0.0.1 - - [23/Mar/2025 20:47:09] "GET /index HTTP/1.1" 200 -
127.0.0.1 - - [23/Mar/2025 20:47:09] "GET /favicon.ico HTTP/1.1" 404 -
'''